\documentclass[a4paper,11pt]{article}

%packages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\usepackage[pdftex]{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{subfigure}
\usepackage{epstopdf}
\usepackage{pdfpages}
\usepackage{float} 
\usepackage{amssymb}
\newcommand{\ud}{\,\mathrm{d}}
\usepackage[left=1cm, right=1cm, top=1.5cm, bottom=1.5cm]{geometry}
\usepackage{url}
\usepackage{listings}
\usepackage{color}
\usepackage{textcomp}

\author{Walsdorff Antoine, Fastré Ludovic, Dekeyser Olivier,\\ Chatelain Julie, Carion Tristan, Ballarini Robin,\\ Darko Nikolas}

\title{Mission : Tables de Hachage ordonnées}
\begin{document}
\maketitle
\section*{Introduction}
	Dans le cadre de ce projet, nous avons dû étendre notre projet précédent afin qu'il utilise des tables des arbres de tri comme tables de hachage. Nous devions également rendre possible la recherche de revues en fonction de plusieurs critères.
	
\section{Fonctionnement général}
	Notre implémentation du programme voulu utilise une interface graphique afin de communiquer avec l'utilisateur et lui permettre de faire des recherches parmi les revues\footnote{qui ont, au préalable, été lues depuis le fichier d'entrée}. 
	
	En ce qui concerne les arbres, nous avons utilisé l'implémentation \verb\java.util.TreeMap\ de l'API java. Plus précisément, les arbres utilisés contiennent des objets \verb\Revue\ et des clés qui sont des chaînes de caractères contenant les titres, rangs,... de ces dernières. Il y a un arbre par champ de recherche. L'utilisation des arbres de tri se fait via un objet \verb\Biblio\ qui sert d'abstraction et contient tous les arbres.
	
	Les données des revues sont chargées en mémoire depuis un fichier passé en argument au programme. Dans le fichier, les revues sont présentes sur un format donné : une ligne de données, chaque donnée séparée des autres par une virgule. Lorsqu'une donnée contient des virgules, elle est délimitée par des guillemets.
	
\section{Manuel utilisateur}
	Pour démarrer le programme :
	\begin{enumerate}
		\item Se mettre dans le dossier "Biblio"
		\item Compiler les fichiers sources
		\item Lancer le programme à partir de "Main.class" avec le fichier "Journals.csv" comme seul argument
		\item Effectuer des recherches à partir de l'interface graphique
	\end{enumerate}
	
\section{Structure du programme}
	Nous avons structuré notre programme de la manière suivante. Nous avons fait en sorte que n'importe quel type de \verb\java.util.Map\ puisse être facilement utilisé, de même pour différents types de revues.
	
	\subsection{Classe Revue}
		Cette classe modélise les objets représentant les revues à stocker dans la table de hachage. Il est directement possible de créer un objet \verb\Revue\ depuis la ligne qui lui correspond dans le fichier d'entrée.
		
		Chaque revue contient différentes données dont au moins un titre. Des méthodes permettent de récupérer ces données ou de les modifier\footnote{setters et getters}. Nous avons également modifié la classe pour que les String entre guillemets soient bien enregistrés car ce n'était pas le cas lors de la mission précédente.
		
	\subsection{Classe RevueComparator}
Cette classe compare les différents types. Par ordre alphabétique, par ordre croissant ou pour les rangs A*;A;B;C;D.
		
	\subsection{Classe Biblio}
		Cette classe sert d'abstraction pour les arbres de tri utilisés par le programme et les configure de manière à ce que chaque arbre corresponde à un champ de recherche possible pour une revue.
		
		Plus précisément, on a des arbres qui ont comme clés :
		\begin{itemize}
			\item Le rang
			\item Le titre
			\item Le For1 (Un chiffre)
			\item Le For1Name (Une classification)
			\item Le For2 (Un chiffre)
			\item Le For2Name (Une seconde classification en option)
			\item Le For3 (Un chiffre)
			\item Le For3Name (Une troisième classification en option)
		\end{itemize}
		
		On peut ajouter ou retirer des revues de la bibliothèque ainsi que fixer ou récupérer un tableau contenant les arbres utilisés. Notons que la bibliothèque peut travailler sur n'importe quel \verb\SortedMap\ mais fonctionne par défaut sur des \verb\TreeMap\. De plus, cette classe fonctionnerait également pour des objets qui héritent de \verb\Revue\.
		
	\subsection{Classe IO}
		Cette classe gère les opérations de lecture sur le fichier d'entrée et permet de le lire ligne par ligne. Dans ce cas, cela se traduit par une lecture revue par revue. Cette classe n'a pas été modifiée depuis la mission précédente.
		
	\subsection{Classe Search}
		Cette classe permet de rechercher une revue de la bibliothèque à partir des différentes données disponibles. Si l'utilisateur n'entre que le début d'un donnée, on recherche toutes les clés qui commencent par ce début de donnée. 
		
	\subsection{Classe SearchWindow}
		Cette classe permet de configurer les composants et différents listeners nécessaires au bon fonctionnement de l'interface graphique utilisateur. Cette interface est constituée d'un champs de recherche. Au dessus, il y a des checkboxes qui permettent de choisir quel champs de recherche nous voulons comme le titre, le rang, etc... Nous pouvons également trier les revues en fonction de l'ordre alphabétique ou de leur rang. Dans le cas où la recherche n'est pas assez présice et qu'il y a plus d'un résultat possible, nous ressortons tous les résultats possibles.
		
	\subsection{Classe Main}
		Cette classe contient la méthode main du programme. Cette dernière charge les revues en mémoire\footnote{dans la table de hachage} depuis le fichier passé en argument du programme.
		
		Ensuite, il y a initialisation de l'interface graphique utilisateur. Après, le programme réagira aux demandes de l'utilisateur sur le GUI. Cette classe n'a pas été modifiée depuis la mission précédente.
		
\section{Choix de conception : Plusieurs TreeMap}
	Nous avons choisi de modéliser notre bibliothèque à l'aide de $8$ arbres : un pour chaque donnée possible. Cela nous permet de faire des recherches rapides quelque soit le critère de recherche courant. En effet, avoir des arbres différents avec des clés qui correspondent aux recherches possibles permet de trouver les résultats de la recherche en $O(log\ n)$\footnote{Les arbres utilisés dans notre implémentation sont en fait des red-black trees}, $n$ étant le nombre de revues chargées dans les arbres.
	
	Du point de vue de la complexité spatiale, le désavantage dû au fait que l'on stocke $8$ arbres en mémoire n'est pas vraiment important. En effet, soit $n$ le nombre de revues, on a une complexité spatiale en $O(8n)=O(n)$.
	
	L'autre désavantage est qu'on doive insérer $8$ fois plus d'éléments dans les arbres lors du chargement des revues : on est en $O(8*log\ n)=O(log\ n)$. L'initialisation prendra un peu plus de temps.
	
\section*{Remarques}
	\begin{itemize}
		\item Lorsque notre programme doit afficher une liste triée des revues, cela prend beaucoup de temps : la performance est à améliorer.
	\end{itemize}
\end{document}